package com.campus.backend.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.campus.backend.entity.Merchant;
import com.campus.backend.service.MerchantService;
import com.campus.backend.bean.merchant.MerchantUpdateBean;
import cn.hutool.core.bean.BeanUtil;
import com.campus.common.bean.common.PageQueryParam;
import com.campus.common.bean.common.Pagination;
import com.campus.common.bean.common.Resp;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.time.LocalDate;
import java.time.LocalDateTime;

/**
 * <p>
 * 商户表 前端控制器
 * </p>
 *
 * @author ZhaoYuJie
 * @since 2025-05-21
 */
@Api(tags = "商户信息管理接口")
@RestController
@RequestMapping("/merchant")
public class MerchantController {

    @Autowired
    private MerchantService merchantService;

    /**
     * 分页查询商户信息列表
     * @param queryParam 查询参数
     * @param name 商户名称（可选）
     * @param phone 联系电话（可选）
     * @param status 营业状态（可选）
     * @return 分页结果
     */
    @ApiOperation("分页查询商户信息列表")
    @GetMapping("/list")
    public Resp<Pagination<Merchant>> getMerchantList(PageQueryParam queryParam, String name, String phone, Integer status) {
        PageInfo<Merchant> pageInfo = PageHelper.startPage(queryParam.getPageNo(), queryParam.getPageSize())
                .doSelectPageInfo(() -> {
                    LambdaQueryWrapper<Merchant> queryWrapper = new LambdaQueryWrapper<>();
                    queryWrapper.like(StringUtils.isNotBlank(name), Merchant::getName, name)
                            .like(StringUtils.isNotBlank(phone), Merchant::getPhone, phone)
                            .eq(status != null, Merchant::getStatus, status)
                            .orderByDesc(Merchant::getCreateTime);
                    merchantService.list(queryWrapper);
                });
        return Resp.successPageable(pageInfo);
    }

    /**
     * 更新商户信息
     * @param merchantUpdateBean 商户更新信息
     * @return 操作结果
     */
    @ApiOperation("更新商户信息")
    @PutMapping("/update")
    public Resp<Void> updateMerchant(@Valid @RequestBody MerchantUpdateBean merchantUpdateBean) {
        // 查询商户记录
        Merchant existMerchant = merchantService.getById(merchantUpdateBean.getId());
        if (existMerchant == null) {
            return Resp.error("商户记录不存在");
        }
        
        // 使用BeanUtil复制属性
        Merchant updateMerchant = new Merchant();
        BeanUtil.copyProperties(merchantUpdateBean, updateMerchant);
        updateMerchant.setUpdateTime(LocalDateTime.now());
        
        merchantService.updateById(updateMerchant);
        return Resp.success();
    }

    /**
     * 设置商户排序号
     * @param merchantId 商户ID
     * @param seqNo 排序号
     * @param seqExpireDate 排序失效日期（可选）
     * @return 操作结果
     */
    @ApiOperation("设置商户排序号")
    @PutMapping("/setSeqNo")
    public Resp<Void> setMerchantSeqNo(@RequestParam Integer merchantId, 
                                       @RequestParam Integer seqNo, 
                                       @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate seqExpireDate) {
        // 查询商户记录
        Merchant existMerchant = merchantService.getById(merchantId);
        if (existMerchant == null) {
            return Resp.error("商户记录不存在");
        }

        if(seqNo > 0 && seqExpireDate == null){
            return Resp.error("推荐商家时请填写排序失效日期");
        }
        
        // 使用LambdaUpdateWrapper明确更新字段，包括null值
        LambdaUpdateWrapper<Merchant> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(Merchant::getId, merchantId)
                    .set(Merchant::getSeqNo, seqNo)
                    .set(Merchant::getSeqExpireDate, seqExpireDate)  // 即使为null也会更新
                    .set(Merchant::getUpdateTime, LocalDateTime.now());
        
        merchantService.update(updateWrapper);
        return Resp.success();
    }
}
